package com.jetinno.serialport_app

import android.os.SystemClock
import com.jinuo.mhwang.serialport.BaseSerialPort
import java.io.File
import java.io.IOException

/**
 * Created by zhangyuncai on 2024/11/4.
 * 描述：//Todo
 */
object DemoCom : BaseSerialPort() {

    var file: File? = null//串口路径文件

    /**
     * 向串口写入数据
     * @param data 字符串
     */
    override fun write(data: String?): Boolean {
        if (mOutputStream == null) {
            return false
        }
        try {
            //HexTrans从其他库获取
            mOutputStream.write(HexTrans.hexString2Bytes(data))
        } catch (e: Exception) {
            return false
        }
        return true
    }

    /**
     * 向串口写入数据
     * @param data 字节数组
     */
    override fun write(data: ByteArray?): Boolean {
        if (mOutputStream == null) {
            return false
        }
        try {
            mOutputStream.write(data)
        } catch (e: java.lang.Exception) {
            return false
        }
        return true
    }

    /**
     * 从串口获取数据
     * @return 字符串
     */
    override fun receive(): String? {
        val data = receiveBytes() ?: return null
        return HexTrans.bytes2HexString(data, data.size)
    }

    /**
     * 从串口获取数据
     * @return 字节数组
     */
    override fun receiveBytes(): ByteArray? {
        if (mInputStream == null) {
            return null
        }

        //暂停200毫秒以等待数据返回
        SystemClock.sleep(200)
        try {
            // 先判断是否有数据获取，防止inputStream.read阻塞
            return if (mInputStream.available() > 0) {
                super.readData(mInputStream)
            } else {
                null
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return null
    }

    /**
     * 打开串口
     * 必须要有串口文件路径和串口波特率
     */
    override fun open(): Boolean {
        val path: String = "/dev/ttyS7"//串口路径文件
        if (path == null) {
            return false
        }
        file = File(path)
        if (!file!!.exists()) {//串口路径文件不存在
            return false
        }
        val rate = 9600//波特率
        return super.openSerialPort(
            file,
            rate,
            0
        )
    }

    /**
     * 关闭串口
     */
    override fun close() {
        if (null == file || !file!!.exists()) {
            return
        }
        super.closeSerialPort(file)
        file = null
    }
}